﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
   public  class UsuarioDAL : BaseDAL 
    {
       public UsuarioBE Login(UsuarioBE oUsuarioBE)
       {
           UsuarioBE oUsuario = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@Usuario", oUsuarioBE.Usuario));
               cmd.Parameters.Add(new SqlParameter("@Password", oUsuarioBE.Password));
               cmd.CommandText = "Login_s";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   Int32 idUsuarioIndex = reader.GetOrdinal("IdUsuario");
                   Int32 usuarioIndex = reader.GetOrdinal("Usuario");
                   Int32 passwordIndex = reader.GetOrdinal("Password");
                   Int32 nombreIndex = reader.GetOrdinal("Nombre");
                   Int32 perfilIndex = reader.GetOrdinal("Perfil");
                   Int32 emailIndex = reader.GetOrdinal("Email");
                   Int32 idVendedorIndex = reader.GetOrdinal("IdVendedor");
                   Int32 idZonaIndex = reader.GetOrdinal("IdZona");
                   Int32 fechaAltaIndex = reader.GetOrdinal("FechaAlta");
                   Int32 activoIndex = reader.GetOrdinal("activo");

                   while (reader.Read())
                   {
                       oUsuario = new UsuarioBE();

                       Object[] values = new Object[reader.FieldCount];
                       reader.GetValues(values);

                      //result = condición_lógica ? valor_si_verdadero : valor_si_falso;

                       oUsuario.IdUsuario = Convert.ToInt32(values[idUsuarioIndex]);
                       oUsuario.Usuario  = Convert.ToString(values[usuarioIndex]);
                       oUsuario.Password = Convert.ToString(values[passwordIndex]);
                       oUsuario.Nombre = Convert.ToString(values[nombreIndex]);
                       oUsuario.Perfil  = Convert.ToString(values[perfilIndex]);
                       oUsuario.Email = Convert.ToString(values[emailIndex]);
                       oUsuario.IdVendedor = values[idVendedorIndex] == DBNull.Value ? null : (int?)values[idVendedorIndex];
                       oUsuario.IdZona = values[idZonaIndex] == DBNull.Value ? null : (int?)values[idZonaIndex];
                       oUsuario.FechaAlta = values[fechaAltaIndex] == DBNull.Value ? null : (DateTime?) values[fechaAltaIndex];
                       oUsuario.Activo = Convert.ToBoolean(values[activoIndex]);
                   }
               }

           }
           return oUsuario;
       }

       public List<UsuarioBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
       {
           UsuarioSC wFiltroSC = (UsuarioSC)pFiltroSC;
           if (wFiltroSC == null)
               wFiltroSC = new UsuarioSC();

           List<UsuarioBE> listaDeUsuarioBE = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@IdUsuario", wFiltroSC.IdUsuario));
               cmd.Parameters.Add(new SqlParameter("@Usuario", wFiltroSC.Usuario));
               cmd.Parameters.Add(new SqlParameter("@Password", wFiltroSC.Password));
               cmd.Parameters.Add(new SqlParameter("@Nombre", wFiltroSC.Nombre));
               cmd.Parameters.Add(new SqlParameter("@Perfil", wFiltroSC.Perfil ));
               //cmd.Parameters.Add(new SqlParameter("@Email", wFiltroSC.Email));
               cmd.Parameters.Add(new SqlParameter("@IdVendedor", wFiltroSC.IdZona));
               cmd.Parameters.Add(new SqlParameter("@IdZona", wFiltroSC.IdZona));
               cmd.Parameters.Add(new SqlParameter("@Activo", wFiltroSC.Activo));
               cmd.Parameters.Add(new SqlParameter("@pagesize", pPageSize));
               cmd.Parameters.Add(new SqlParameter("@pagenum", pPageNum));

               SqlParameter p = new SqlParameter();
               p.ParameterName = "@PageCount";
               p.Direction = ParameterDirection.Output;
               p.SqlDbType = SqlDbType.Int;
               cmd.Parameters.Add(p);

               cmd.CommandText = "Usuarios_GetAllPaginated";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   listaDeUsuarioBE = new List<UsuarioBE>();

                   while (reader.Read())
                   {
                       UsuarioBE oUsuarioBE = ConstruirUsuario(reader);

                       listaDeUsuarioBE.Add(oUsuarioBE);
                   }
               }
               reader.Close();
               pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;

           }
           return listaDeUsuarioBE;
       }

       private UsuarioBE ConstruirUsuario(SqlDataReader reader)
       {
           UsuarioBE oUsuarioBE = new UsuarioBE();
           Object[] values = new Object[reader.FieldCount];

           reader.GetValues(values);

            oUsuarioBE.IdUsuario = Int32.Parse(reader["IdUsuario"].ToString());
            oUsuarioBE.Usuario  = reader["Usuario"].ToString();
            oUsuarioBE.Password = reader["Password"].ToString();
            oUsuarioBE.Nombre = reader["Nombre"].ToString();
            oUsuarioBE.Perfil = reader["Perfil"].ToString();
            oUsuarioBE.Email = reader["Email"].ToString();
            oUsuarioBE.oVendedorBE   = new VendedorBE();
            if (reader["IdVendedor"] != DBNull.Value)
            {
                oUsuarioBE.oVendedorBE.IdVendedor = Int32.Parse(reader["IdVendedor"].ToString());
                oUsuarioBE.oVendedorBE.Apellido = reader["Apellido"].ToString();
                oUsuarioBE.oVendedorBE.Nombre = reader["Vendedor"].ToString();
            }
            oUsuarioBE.oZonasBE = new ZonasBE();
            if (reader["IdZona"] != DBNull.Value)
            {
                oUsuarioBE.oZonasBE.IdZona = Int32.Parse(reader["IdZona"].ToString());
                oUsuarioBE.oZonasBE.Descripcion = reader["Descripcion"].ToString();
            }

            oUsuarioBE.FechaAlta = DateTime.Parse(reader["FechaAlta"].ToString());
            oUsuarioBE.Activo = Boolean.Parse(reader["Activo"].ToString());


            return oUsuarioBE;
       }

       public UsuarioBE SeleccionarPorId(UsuarioBE pUsuarioBE)
       {
           UsuarioBE oUsuarioBE = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@IdUsuario", pUsuarioBE.IdUsuario));
               cmd.CommandText = "Usuarios_GetById";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   if (reader.Read())
                       oUsuarioBE = ConstruirUsuario(reader);
               }

           }
           return oUsuarioBE;
       }

       public void Insertar(UsuarioBE pElemBE)
       {
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               try
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Usuarios_i";
                   cmd.Parameters.Add(new SqlParameter("@Usuario", pElemBE.Usuario));
                   cmd.Parameters.Add(new SqlParameter("@Password", pElemBE.Password));
                   cmd.Parameters.Add(new SqlParameter("@Nombre", pElemBE.Nombre));
                   cmd.Parameters.Add(new SqlParameter("@Perfil", pElemBE.Perfil));
                   cmd.Parameters.Add(new SqlParameter("@Email", pElemBE.Email));
                   cmd.Parameters.Add(new SqlParameter("@IdVendedor", pElemBE.oVendedorBE.IdVendedor));
                   cmd.Parameters.Add(new SqlParameter("@IdZona", pElemBE.oZonasBE.IdZona));
                   cmd.Parameters.Add(new SqlParameter("@FechaAlta", pElemBE.FechaAlta));
                   cmd.Parameters.Add(new SqlParameter("@Activo", pElemBE.Activo));

                   SqlParameter p = new SqlParameter();
                   p.ParameterName = "@IdUsuario";
                   p.Direction = ParameterDirection.Output;
                   p.SqlDbType = SqlDbType.Int;
                   cmd.Parameters.Add(p);

                   cnn.Open();
                   cmd.ExecuteNonQuery();
                   pElemBE.IdUsuario = (Int32)cmd.Parameters["@IdUsuario"].Value;
               }
               catch (Exception)
               {
                   throw;
               }

           }
       }

       public void Modificar(UsuarioBE pElemBE)
       {
           try
           {
               using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Usuarios_u";
                   cmd.Parameters.Add(new SqlParameter("@IdUsuario", pElemBE.IdUsuario));
                   cmd.Parameters.Add(new SqlParameter("@Usuario", pElemBE.Usuario));
                   cmd.Parameters.Add(new SqlParameter("@Password", pElemBE.Password));
                   cmd.Parameters.Add(new SqlParameter("@Nombre", pElemBE.Nombre));
                   cmd.Parameters.Add(new SqlParameter("@Perfil", pElemBE.Perfil));
                   cmd.Parameters.Add(new SqlParameter("@Email", pElemBE.Email));
                   cmd.Parameters.Add(new SqlParameter("@IdVendedor", pElemBE.oVendedorBE.IdVendedor  ));
                   cmd.Parameters.Add(new SqlParameter("@IdZona", pElemBE.oZonasBE.IdZona));
                   cmd.Parameters.Add(new SqlParameter("@FechaAlta", pElemBE.FechaAlta));
                   cmd.Parameters.Add(new SqlParameter("@Activo", pElemBE.Activo));

                   cnn.Open();
                   cmd.ExecuteNonQuery();
               }
           }
           catch (Exception)
           { throw; }
       }

       public void Delete(UsuarioBE pUsuario)
       {
           try
           {
               using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Usuarios_d";
                   cmd.Parameters.Add(new SqlParameter("@IdUsuario", pUsuario.IdUsuario));
                   cnn.Open();
                   cmd.ExecuteNonQuery();
               }
           }
           catch (Exception)
           { throw; }

       }
    }
}
